package com.zxjbyte.yiyi.framework.common.constant;

import com.zxjbyte.yiyi.framework.common.core.CacheKey;
import com.zxjbyte.yiyi.framework.common.core.IRedisKey;

import java.time.Duration;

/**
 * redis key 定义
 * @Author zhangxingjia
 * @Date 2023/4/3 14:10
 * @Version: 1.0
 */
public class RedisKeyDefine implements IRedisKey {

    public static final String BASE_PREFIX = "yiyi_boot";

    // oss config
    public static final String OSS_CONFIG = "oss:config";

    // 字典缓存
    public static final String DICT = "dict";

    /**
     * 获取字典缓存KEY
     * @param dictType 字典类型
     * @return
     */
    public static String getDictKey(String dictType){
        return getKey(DICT, dictType);
    }

    public static CacheKey getObjectKey(Object... suffix){
        return RedisKeyDefine.getObjectKey(null, suffix);
    }

    public static String getKey(Object... suffix){
        return getInstance().buildStrKey(suffix);
    }


    public static CacheKey getObjectKey(Duration expire, Object... suffix){
        return getInstance().buildCacheKey(expire, suffix);
    }

    /**
     * 常用单例模式介绍：
     *   1，饿汉式单例模式：在类加载时就创建了单例实例，线程安全，但可能会造成不必要的资源浪费。
     *   2，懒汉式单例模式：在第一次使用时创建单例实例，存在线程安全问题，需要进行同步处理。
     *   3，双重校验锁单例模式：结合了饿汉式和懒汉式的优点，既能保证线程安全，又能减少不必要的资源浪费。
     *   4，静态内部类单例模式：利用了 Java 的类加载机制，只有在第一次使用时才会加载内部类，从而创建单例实例，线程安全，同时实现了懒加载和线程安全。
     * @return
     */
    public static RedisKeyDefine getInstance() {
        return RedisKeyDefineHolder.INSTANCE;
    }

    private static class RedisKeyDefineHolder {
        private static final RedisKeyDefine INSTANCE = new RedisKeyDefine();
    }


    public String getPrefix() {
        return BASE_PREFIX;
    }
}
